Skip to main content

17 动态类型

类型系统的简化

JavaScript 或者说 typeof() 所支持的 7 种类型,其中的“对象(object)”与“函数(function)”合称为引用类型,其他类型作为值类型。

  • 从值 x 到引用,调用 Object(x) 函数。
  • 从引用 x 到值,调用 x.valueOf() 方法;或调用 4 种值类型的包装类函数,例如 Number(x),或者 String(x) 等等。

从值 x 到引用

> x = 1234;

> Object(x);
[Number: 1234]

值 VS 原始值

任何对象都会有继承自原型的两个方法,称为toString()和valueOf(),这是 JavaScript 中“对象转换为值”的关键。

“对象 -> 值”的转换结果要尽量地趋近于 string、number 和 boolean 三者之一。

  • 浏览器可以显示的东西,是 string;
  • 可以计算的东西,是 number;
  • 可以表达逻辑的东西,是 boolean。

隐式转换

# 1. 如果x是非对象,则返回x
> _ToPrimitive(5)
5

# 2. 如果x是对象,则尝试得到由x.valueOf()返回的原始值
> Object(5).valueOf()
5
# 如果一个运算无法确定类型,那么在类型转换前,它的运算数将被预设为 number。

> x = Symbol()

> obj = Object(x)

> obj.valueOf() === x
true

> Object(5) + Object(5)
10